#ifndef __CARTE__
#define __CARTE__

#include "../include/Heros.h"
#include <fstream>

class Heros;
/*

La carte est un tableau 2D d'entier dont la valeur indique le type de terrain.


0: case vide, non initialiser. N'est utile que pour ne pas avoir à initialiser les cases qui n'aparaissent pas

Terrains franchissables:

Valeurs comprises entre 1 et 20 inclus.
1: herbe
2: sol de pierre
3: terre
4: sable

Terrains infranchissable

Valeurs au dessus ou égale à 21.

21: eau
22: lave
23: rocher
24: mur

*/

///
/// \file Carte.h
/// \brief Module utilisé pour initialiser la carte.
/// \author Nizar
///


///
/// \class Carte
/// \brief Gère les différentes fonctions de la carte.
///


class Carte
{
    public:

        ///
        /// \brief Constructeur
        /// \param nom_fichier[]: Chaine de caractère qui contient le nom du fichier d'où la carte sera chargé.
        ///
        Carte (char nom_fichier[]);

        ///
        /// \brief Destructeur.
        /// Vide le tableau dynamique qu'est la carte.
        ///
        virtual ~Carte ();


        ///
        /// \brief Charge dans le tableau dynamique le contenu du fichier dont le nom est passé en paramètre.
        /// \param nom_fichier[]: Chaine de caractère qui contient le nom du fichier d'où la carte sera chargé. \n
        ///
        void ini_carte (char nom_fichier[]);


        ///
        /// \brief Renvoie un entier qui indique le type de terrain situé dans la case passé en paramètre.
        /// \param dimx: la position sur la l'axe des abscisse. \n
        ///       dimy: la position sur l'axe des ordonnées. \n
        /// \return int : le type de terrain situé dans la case passé en paramètre.
        ///
        int recup_case (int dimx, int dimy);

        ///
        /// \brief Renvoie la largeur de la carte
        /// \return La largeur de la carte.
        ///
        int recup_xmax ();


        ///
        /// \brief Renvoie la hauteur de la carte
        /// \return La hauteur de la carte.
        ///
        int recup_ymax();


        ///
        /// \brief Renvoie un bolléen si la case passé en paramètre peut être franchise.
        /// \param dimx: la position sur la l'axe des abscisse. \n
        ///        dimy: la position sur l'axe des ordonnées. \n
        /// \return Vrai si la case est franchissable, faux sinon
        ///
        bool case_franchissable (int dimx, int dimy);

        ///
        ///\brief Test de régression de la carte
        ///
        void test_reg();

        ///
        ///\brief Renvoie un boléen qui indique si un combat a lieu
        ///\param reinitialise: indique si la probabilité doit être réinitialisé
        ///
        ///\return bool: Vrai si un combat doit avoir lieu, faux sinon
        bool si_combat(bool reinitialise = false);

        ///
        ///\brief Place le héros sur la carte
        ///\param p_heros: le héros à placer \n
        ///       p_x: la position en x \n
        ///       p_y: la position en y
        ///
        void positionne_heros(Heros *p_heros, int p_x, int p_y);

        ///
        ///\brief Déplace le héros sur la Carte
        ///\param p_vect_x: direction en x du héros \n
        ///       p_vect_y: direction en y du héros \n
        ///
        bool deplacer_heros(int p_vect_x, int p_vect_y);

        ///
        ///\brief Recup la case ou se situe le héros
        ///\return int: Contenue de la case
        int recup_case_heros();

    private:
        int ** ma_carte;    ///< Tableau contenant la carte
        ///
        /// \brief Créer le tableau dynamique qui sera utilisé pour stoquer la carte.
        /// \param nom_fichier[]: Chaine de caractère qui contient le nom du fichier d'où la carte sera chargé. \n
        ///
        void ini_tableaudy();

        ///
        /// \brief Récupère xmax et ymax
        /// \param nom_fichier[]: Chaine de caractère qui contient le nom du fichier d'où la carte sera chargé. \n
        ///
        void def_xymax (char nom_fichier[]);

        ///
        /// \brief initilise le tableau dynamique à zéro.
        ///
        void init_a_zero();

        int xmax;        ///< longueur max du tableau

        int ymax;        ///< hauteur max du tableau




        int proba_combat;   ///< Contient la probabilité de tomber sur un combat

        Heros* chef_equipe; ///<Pointeur sur le héros
};


#endif
